local skynet = require "skynet"
local harbor = require "skynet.harbor"
local service = require "skynet.service"
require "skynet.manager"	-- import skynet.launch, ...

skynet.start(function()
	local standalone = skynet.getenv "standalone"

	local launcher = assert(skynet.launch("snlua","launcher"))
	skynet.name(".launcher", launcher)

	--harbor_id == 0 单节点模式， master 和 address 以及 standalone 都不必设置
	local harbor_id = tonumber(skynet.getenv "harbor" or 0)
	if harbor_id == 0 then
		assert(standalone ==  nil)
		standalone = true
		skynet.setenv("standalone", "true")

		--单节点模式下，不需要harbor机制做节点通讯，cdummy服务为了拦截对外广播的全局名字变更
		--有可能注册全局名字
		local ok, slave = pcall(skynet.newservice, "cdummy")
		if not ok then
			skynet.abort()
		end
		skynet.name(".cslave", slave)

	else--多节点模式
		--该进程是主节点，它需要开启一个控制中心，监听一个端口，让其它节点接入
		if standalone then
			--cmaster 作为节点调度使用
			if not pcall(skynet.newservice,"cmaster") then
				skynet.abort()
			end
		end

		--cslave及cmaster要启动该服务，用于节点之间消息转发及同步全局的名字
		local ok, slave = pcall(skynet.newservice, "cslave")
		if not ok then
			skynet.abort()
		end
		skynet.name(".cslave", slave)
	end

	if standalone then
		--master上启动[[DataCenter]] 服务，用于跨节点的数据共享
		local datacenter = skynet.newservice "datacenterd"
		skynet.name("DATACENTER", datacenter)
	end

	--启动用于 [[UniqueService]] 管理
	skynet.newservice "service_mgr"

	--enablessl 默认为空。如果需要通过 ltls 模块支持 https ，那么需要设置为 true 
	local enablessl = skynet.getenv "enablessl"
	if enablessl then
		service.new("ltls_holder", function ()
			local c = require "ltls.init.c"
			c.constructor()
		end)
	end

	--启动用户自定义的脚本
	pcall(skynet.newservice,skynet.getenv "start" or "main")
	skynet.exit()
end)
